package com.atguigu.lease.web.admin.custom.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;


@Component
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {

    //转换器根据控制器方法参数的类型来决定使用哪个枚举类进行转换。
    //避免冲突：即使多个枚举类有相同的 code 值，由于转换器只在特定的枚举类上下文中进行查找，因此不会发生冲突或错误。
    //灵活性：这种设计允许你拥有多个枚举类，每个枚举类可以有自己独立的 code 值集，而无需担心 code 值的全局唯一性。
    //传入的参数是控制器方法的参数的类型
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new Converter<String, T>() {
            @Override
            public T convert(String source) {

                for (T enumConstant : targetType.getEnumConstants()) {
                    if (enumConstant.getCode().equals(Integer.valueOf(source))) {
                        return enumConstant;
                    }
                }
                throw new IllegalArgumentException("非法的枚举值:" + source);
            }
        };
    }
}
